/**
 * PerlaController - part of PerlaGis Architecture
 *
 * Copyright (C) 2010 Ricardo Gonzalez (gomnaz@gmail.com)
 * This program is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see http://www.gnu.org/licenses/
 */
package org.perla.managers;

import java.util.List;
import javax.persistence.EntityManager;
import org.perla.entities.Sensori;
import org.perla.entities.SensoriPK;
import org.perla.exceptions.NoSuchSensorException;
import org.perla.exceptions.WrongSensorTypeException;

/**
 * Classe statica che gestisce i sensori.
 * Implementa metodi che interrogano il database, metodi che correggono i
 * sensori per evitare errori nella creazione della risposta XML e metodi di
 * controllo.
 *
 * @author Ricardo Gonzalez
 * @author Eva Gjeci
 */
public class Sensor {

    /**
     * Rimuove la ridondanza nel nodo e nel tipo del sensore passato come
     * parametro.
     *
     * @param s il sensore
     */
    public static void clearRedudancy(Sensori s) {
        s.getNodo().getSensoriList().clear();
        s.getTiposensore().getSensoriList().clear();
    }

    /**
     * Rimuove la ridondanza nel nodo e nel tipo dei sensori presenti nella
     * lista passata come parametro.
     * 
     * @param l la lista dei sensori
     */
    public static void clearListRedudancy(List<Sensori> l) {
        for (Sensori s : l) {
            clearRedudancy(s);
        }
    }

    /**
     * Controlla che il tipo del sensore corrisponda alla stringa passata come argomento.
     *
     * @param s il sensore
     * @param name il nome del tipo del sensore
     * @throws WrongSensorTypeException se il nome non corrisponde al tipo del sensore
     */
    public static void hasCorrectType(Sensori s, String name) throws WrongSensorTypeException {
        if (!s.getTiposensore().getNome().toLowerCase().equals(name.toLowerCase())) {
            throw new WrongSensorTypeException(name);
        }
    }

    /**
     * Recupera dal database il sensore corrispondente alle chiavi passate come parametro.
     *
     * @param idNodo la chiave del nodo
     * @param idSensore la chiave del sensore
     * @param em l'entity manager
     * @return il sensore
     * @throws NoSuchSensorException se le chiavi non corrispondono ad alcun sensore
     */
    public static Sensori get(String idNodo, String idSensore, EntityManager em) throws NoSuchSensorException {
        Sensori s = em.find(Sensori.class, new SensoriPK(idNodo, idSensore));
        if (s == null) {
            throw new NoSuchSensorException(idNodo, idSensore);
        }
        clearRedudancy(s);
        return s;
    }

    /**
     * Recupera la lista di tutti i sensori disponibili.
     *
     * @param em l'entity manager
     * @return la lista dei sensori
     */
    public static List<Sensori> getAll(EntityManager em) {
        List<Sensori> l = em.createNamedQuery("Sensori.findAll").getResultList();
        clearListRedudancy(l);
        return l;
    }

    /**
     * Recupera la lista dei sensori appartenenti al nodo passato come parametro.
     *
     * @param idNodo la chiave del nodo
     * @param em l'entity manager del Perla
     * @return la lista dei sensori
     */
    public static List<Sensori> getByNode(String idNodo, EntityManager em) {
        List<Sensori> l = em.createNamedQuery("Sensori.findByIdNodo").setParameter("idNodo", idNodo).getResultList();
        clearListRedudancy(l);
        return l;
    }
}
